/*******************************************************************************
 * ATE, Automation Test Engine
 *
 * Copyright 2015, Montreal PROT, or individual contributors as
 * indicated by the @author tags or express copyright attribution
 * statements applied by the authors.  All third-party contributions are
 * distributed under license by Montreal PROT.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package utils;

import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;

import initializer.SuiteInitializer;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * The listener interface for receiving screenshot events.
 * The class that is interested in processing a screenshot
 * event implements this interface, and the object created
 * with that class is registered with a component using the
 * component's <code>addScreenshotListener<code> method. When
 * the screenshot event occurs, that object's appropriate
 * method is invoked.
 *
 * @see ScreenshotEvent
 */
public class ScreenshotListener extends TestListenerAdapter { // NOPMD

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void onTestFailure(final ITestResult tr) { // NOPMD
		File screenshot = new File("screenshots" + File.separator
				+ System.currentTimeMillis() + "_" + tr.getName() + ".png");
		if (!screenshot.exists()) {
			new File(screenshot.getParent()).mkdirs();
			try {
				screenshot.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();// NOPMD
			}
		}
		try {
			new FileOutputStream(screenshot)
					.write(((TakesScreenshot) SuiteInitializer.getDriver())
							.getScreenshotAs(OutputType.BYTES));
		} catch (FileNotFoundException e) {
			e.printStackTrace();// NOPMD
		} catch (IOException e) {
			e.printStackTrace();// NOPMD
		}
		System.out.println("Written screenshot to "// NOPMD
				+ screenshot.getAbsolutePath());
	}
}
